/*
  按约数的个数进行排序
  题目描述
    给出一个 n 个正整数的数组，按以下规则排序：
      如果两个数的约数个数不同，约数个数较少的排在前面，即按约数个数从少到多排序。
      如果两个数的约数个数相同，则按数值从小到大排序。
  输入描述
    第 1 行，输入一个正整数n；
    接下来 n 行，每行一个正整数，表述数组中的数。
  输出描述
    输出一行，按照题目要求排序后的结果，每个数之间用一个空格间隔。
  样例1
    输入
      6
      1 10 8 12 9 20
    输出
      1 9 8 10 12 20
  提示
   【数据范围】
      1 <= n <= 10000
      每个正整数x：0 <= x <= 1000
*/

#include <iostream>
#include <algorithm>

using namespace std;

// 定义获取约数个数的函数
int a1(int num) {
    int n = 0;
    for (int i = 1; i <= num; i++) {
        if (num % i == 0) {
            n++;
        }
    }

    return n;
}

// 定义排序规则函数，排序规则如下:
// 1) 按其约数的个数的值从小到大的顺序进行排序;
// 2) 如果2个数的约数的个数相同, 则按照这2个数的值从小到大的顺序进行个排序
bool cmp(int a, int b) {
    if (a1(a) != a1(b)) {
        return a1(a) < a1(b);
    } else {
        return a < b;
    }
}

int main() {
    int a[10005] = {};
    int n;

    cin >> n;
    for (int i = 0; i <= n - 1; i++) {
        cin >> a[i];
    }

    // 使用 sort 函数排序法, 对数组 a[0] ~ a[n-1] 按自定义排序规则对进行排序
    sort(a + 0, a + n, cmp);

    for (int i = 0; i <= n - 1; i++) {
        cout << a[i] << " ";
    }

    return 0;
}